﻿#define _CRT_SECURE_NO_WARNINGS 1

//预定义符号
//__FILE__      //进行编译的源文件
//__LINE__     //文件当前的行号
//__DATE__    //文件被编译的日期
//__TIME__    //文件被编译的时间
//__STDC__    //如果编译器遵循ANSI C, 其值为1, 否则未定义
//#include <stdio.h>
//int main()
//{
//	printf("%s\n", __FILE__);
//	printf("%d\n", __LINE__);
//	printf("%s\n", __DATE__);
//	printf("%s\n", __TIME__);
//	//printf("%d\n", __STDC__);
//	printf("%s\n", __FUNCTION__);
//	return 0;
//}

//#define 定义标识符
//#define name stuff
//注意:在defien定义标识符的时候, 不要在最后加上;

//#define定义宏
//#define name( parament-list ) stuff
//其中的 parament-list是一个由逗号隔开的符号表, 它们可能出现在stuff中
//注意:参数列表的左括号必须与name紧邻, 
//如果两者之间有任何空白存在, 参数列表就会被解释为stuff的一部分

//#define SQUARE(X) ((X)*(X))
//#include <stdio.h>
//int main()
//{
//	printf("%d\n", SQUARE(5+1));  //36
//	printf("%lf\n", SQUARE(5.0));  //25.000000
//	 
//	return 0;
//}

//int main()
//{
//	printf("hello bit\n");
//	printf("hello " "bit\n");  //会自动将两个字符串衔接在一起
//
//	return 0;
//}

//#define 替换规则
//在程序中扩展#define定义符号和宏时, 需要涉及几个步骤
//1.在调用宏时, 首先对参数进行检查, 看看是否包含任何由#define定义的符号, 如果是, 它们首先被替换。
//2.替换文本随后被插入到程序中原来文本的位置, 对于宏, 参数名被他们的值所替换
//3.最后, 再次对结果文件进行扫描, 看看它是否包含任何由#define定义的符号, 如果是, 就重复上述处理过程
//注意:
//1.宏参数和#define 定义中可以出现其他#define定义的符号, 但是对于宏, 不能出现递归
//2.当预处理器搜索#define定义的符号的时候, 字符串常量的内容并不被搜索

//使用 # ,把一个宏参数变成对应的字符串
//#define PRINT(format, x) printf("the value of "#x" is "format"\n", x)
//int main()
//{
//	int a = 10;
//	//printf("the value of a is %d\n", a);
//	PRINT("%d", a);
//	//printf("the value of ""a"" is ""%d""\n", x)
//	int b = 20;
//	//printf("the value of b is %d\n", b);
//	PRINT("%d", b);
//
//	float f = 3.14f;
//	PRINT("%f", f);
//	//printf("the value of ""f"" is ""%f""\n", x)
//	return 0;
//}

//##可以把位于它两边的符号合成一个符号
//它允许宏定义从分离的文本片段创建标识符
//#define CAT(x,y) x##y
//Class##109
//Class109
//int main()
//{
//	int Class109 = 2023;
//	printf("%d\n", CAT(Class, 109));
//
//	return 0;
//}